Skip to content

Feature v0.11.0 merge#141

Closed
StanBarrows wants to merge 102 commits intomainfrom
feature-v0.11.0-merge
Closed

Feature v0.11.0 merge#141
StanBarrows wants to merge 102 commits intomainfrom
feature-v0.11.0-merge

Conversation

@StanBarrows
Copy link
Contributor

No description provided.

Onatcer and others added 30 commits December 2, 2025 13:30
Onatcer and others added 26 commits February 17, 2026 17:08
add request classes and fix collection typing for clients, tasks and tags
this is a trade-off where for non grid aligned entries, the cursor position is a bit off, but data and visual are stil in sync. otherwise fc overrides height on drag, causing flickers.
the synced snapDuration cause incorrect noops on updates f.e. 15:55-16:00 on a 15 minute snap
Added a warning about AI slop pull requests and potential bans.
Copilot AI review requested due to automatic review settings March 16, 2026 13:12
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Merges changes for the v0.11.0 feature set, including UI refactors to shared UI primitives, new filtering/sorting UX, API enhancements (notably invoicing-related time entry behavior), and broad tooling/CI updates (PHP 8.4, Node 22, Playwright/E2E improvements).

Changes:

  • Refactors multiple Vue components to new Select, Field, DropdownMenu, and related UI primitives; adds new filter UI components and table sorting.
  • Adds time entry invoiced_at support with API filtering/guards, plus reporting/shared report UI updates.
  • Updates developer tooling: npm workspaces, dependency bumps, Playwright fixtures & E2E utilities, CI workflow adjustments.

Reviewed changes

Copilot reviewed 191 out of 452 changed files in this pull request and generated 10 comments.

Show a summary per file
File Description
resources/js/Components/Common/Reporting/ReportingRoundingControls.vue Switches to new UI primitives (Field, Popover) and updates styling/sizes.
resources/js/Components/Common/Reporting/ReportingGroupBySelect.vue Replaces legacy dropdown/badge trigger with new Select UI component.
resources/js/Components/Common/Reporting/ReportingFilterBar.vue Adds a new reporting filter bar assembling multiple filter controls and rounding controls.
resources/js/Components/Common/Reporting/ReportingExportButton.vue Migrates export dropdown to DropdownMenu primitives.
resources/js/Components/Common/Reporting/ReportingChart.vue Simplifies axis rendering configuration (hides axis line/ticks/labels).
resources/js/Components/Common/Report/ReportTableRow.vue Adds created/expires columns with localized date formatting and visibility icons.
resources/js/Components/Common/Report/ReportTableHeading.vue Updates headings to match new report table columns.
resources/js/Components/Common/Report/ReportTable.vue Adjusts report table grid template and empty-state col-span.
resources/js/Components/Common/Report/ReportEditModal.vue Refactors form fields to Field components and adds UTC/local conversion for public_until.
resources/js/Components/Common/Report/ReportCreateModal.vue Refactors form fields and adds query invalidation + redirect after creation.
resources/js/Components/Common/ProjectMember/ProjectMemberTableRow.vue Migrates members data source from Pinia store to query hook.
resources/js/Components/Common/ProjectMember/ProjectMemberTableHeading.vue Updates heading styles to new typography color convention.
resources/js/Components/Common/ProjectMember/ProjectMemberMoreOptionsDropdown.vue Migrates members data source from Pinia store to query hook.
resources/js/Components/Common/ProjectMember/ProjectMemberEditModal.vue Refactors label usage to Field components.
resources/js/Components/Common/Project/constants.ts Adds a constant for “no client” sentinel filtering.
resources/js/Components/Common/Project/ProjectsFilterDropdown.vue Introduces a project filter dropdown (status + client filters).
resources/js/Components/Common/Project/ProjectTableRow.vue Migrates clients/tasks data access to query hooks and updates status display.
resources/js/Components/Common/Project/ProjectTableHeading.vue Adds clickable sortable headings with chevrons.
resources/js/Components/Common/Project/ProjectTable.vue Implements client-side sorting using TanStack Table + emits sort changes.
resources/js/Components/Common/Project/ProjectStatusFilterBadge.vue Adds a reusable status filter badge component.
resources/js/Components/Common/Project/ProjectMultiselectDropdown.vue Migrates projects source to query hook; adds “No Project” option and submit emit.
resources/js/Components/Common/Project/ProjectMoreOptionsDropdown.vue Removes delete action from project dropdown UI.
resources/js/Components/Common/Project/ProjectEditModal.vue Refactors labels to Field components; updates client dropdown trigger UI.
resources/js/Components/Common/Project/ProjectClientFilterBadge.vue Adds a reusable client filter badge component.
resources/js/Components/Common/Project/BaseFilterBadge.vue Adds a generic filter badge with dropdown + remove button.
resources/js/Components/Common/PageTitle.vue Adjusts icon sizing/responsiveness.
resources/js/Components/Common/Member/MemberTableRow.vue Updates icons and status rendering; removes store refresh call.
resources/js/Components/Common/Member/MemberTableHeading.vue Adds sortable headings with chevrons.
resources/js/Components/Common/Member/MemberTable.vue Adds client-side sorting via TanStack Table; fixes data-testid.
resources/js/Components/Common/Member/MemberRoleSelect.vue Migrates role selection to Select UI component.
resources/js/Components/Common/Member/MemberMultiselectDropdown.vue Migrates members source to query hook + submit emit.
resources/js/Components/Common/Member/MemberMergeModal.vue Invalidates member queries after merge.
resources/js/Components/Common/Member/MemberMakePlaceholderModal.vue Invalidates member queries after deactivation.
resources/js/Components/Common/Member/MemberInviteModal.vue Refactors labels/errors to Field components.
resources/js/Components/Common/Member/MemberEditModal.vue Refactors billable rate UX + integrates org default rate with tooltips.
resources/js/Components/Common/Member/MemberDeleteModal.vue Refactors labels/errors to Field components + invalidates member queries.
resources/js/Components/Common/Member/MemberCombobox.vue Rebuilds member picker with Radix combobox + dropdown behavior.
resources/js/Components/Common/Member/MemberBillableSelect.vue Migrates billable select to Select UI component.
resources/js/Components/Common/Invitation/InvitationTableHeading.vue Updates heading styles to new typography color convention.
resources/js/Components/Common/Client/ClientTableRow.vue Migrates projects source to query hook and updates status display; removes delete handler.
resources/js/Components/Common/Client/ClientTableHeading.vue Adds sortable headings with chevrons.
resources/js/Components/Common/Client/ClientTable.vue Adds client-side sorting via TanStack Table.
resources/js/Components/Common/Client/ClientMultiselectDropdown.vue Migrates clients source to query hook; adds “No Client” option and submit emit.
resources/js/Components/Common/Client/ClientMoreOptionsDropdown.vue Removes delete action from client dropdown UI.
resources/js/Components/Common/Client/ClientCreateModal.vue Refactors labels to Field components.
resources/js/Components/CommandPalette/index.ts Exposes CommandPaletteProvider barrel export.
playwright/fixtures.ts Implements API-based registration/auth fixture; adds admin/employee fixtures.
playwright/config.ts Adds Mailpit base URL and standard test-user password constant.
playwright.config.ts Increases parallel workers; switches CI reporter to blob; limits Firefox to CI.
package.json Adds npm workspaces and bumps many frontend dependencies/tooling.
lang/en/exceptions.php Adds translation for new TimeEntry invoiced exception.
e2e/utils/tags.ts Uses type-only import for Playwright Page.
e2e/utils/table.ts Adds helper to extract table row names for sorting assertions.
e2e/utils/money.ts Fixes type-only import for NumberFormat.
e2e/utils/mailpit.ts Adds Mailpit helpers to retrieve invitation/reset links for E2E.
e2e/utils/currentTimeEntry.ts Improves timer interaction selectors and assertions.
e2e/tags.spec.ts Expands tag E2E coverage (edit, sorting persistence, employee restrictions).
e2e/import-export.spec.ts Adds E2E coverage for import/export flows and employee restrictions.
docker/prod/deployment/supervisord.worker.conf Removes legacy supervisor worker config.
docker/prod/deployment/supervisord.scheduler.conf Removes legacy supervisor scheduler config.
docker/prod/deployment/supervisord.reverb.conf Removes legacy supervisor reverb config.
docker/prod/deployment/supervisord.horizon.conf Removes legacy supervisor horizon config.
docker/prod/deployment/supervisord.conf Removes legacy root supervisor config.
docker/prod/deployment/start-container Removes legacy container entrypoint script.
docker/prod/deployment/php.ini Removes legacy production php.ini.
docker/prod/deployment/octane/FrankenPHP/supervisord.frankenphp.conf Removes legacy FrankenPHP supervisor config.
docker/prod/deployment/octane/FrankenPHP/Caddyfile Removes legacy FrankenPHP Caddy config.
docker/prod/deployment/healthcheck Removes legacy healthcheck script.
docker/prod/LICENSE Removes embedded MIT license file from docker/prod.
docker/local/pgsql/create-testing-database.sql Removes local SQL script for creating testing DB.
docker/local/minio/create_bucket.sh Removes local MinIO bucket bootstrap script.
docker/local/8.3/supervisord.conf Removes legacy local supervisor config.
docker/local/8.3/start-container Removes legacy local start script.
docker/local/8.3/php.ini Removes legacy local php.ini.
docker/local/8.3/Dockerfile Removes legacy local PHP 8.3 Dockerfile.
database/schema/pgsql_test-schema.sql Removes trailing whitespace line from schema dump.
database/migrations/2025_10_20_120000_add_invoiced_at_to_time_entries_table.php Adds invoiced_at column on time entries.
database/factories/UserFactory.php Updates doc reference to FileHelpers::hashName.
config/excel.php Imports DefaultValueBinder and uses class constant alias.
config/database.php Adds read/write host split for pgsql connection.
config/auth.php Imports User and uses class constant alias.
config/audit.php Imports auditing classes, uses aliases for configuration values.
config/app.php Imports service providers and uses aliases in providers list.
composer.json Bumps PHP requirement to 8.4, updates deps, pins platform PHP to 8.4.0.
bootstrap/app.php Uses imported class names for Application/Kernel/Handler bindings.
app/Service/TimeEntryService.php Fixes rounding “Up” behavior to preserve boundary ends; reuses computed start expr.
app/Service/TimeEntryFilter.php Adds invoiced filtering and supports sentinel none for null relations/tags.
app/Service/ReportExport/CsvExport.php Improves typed exception imports and adds collection/phpdoc type hints.
app/Service/MemberService.php Ensures placeholder user has current_team_id set when created.
app/Service/Dto/ReportPropertiesDto.php Allows sentinel none besides UUIDs in report properties arrays.
app/Service/DashboardService.php Adds organization constraint to weekly billable amount aggregation.
app/Policies/OrganizationPolicy.php Switches update authorization to permission-based check.
app/Models/TimeEntry.php Adds invoiced_at cast and includes it in select columns.
app/Models/Organization.php Adjusts return type import for findOrFail.
app/Http/Resources/V1/TimeEntry/TimeEntryResource.php Exposes invoiced_at in API resource output.
app/Http/Resources/V1/Tag/TagCollection.php Marks collection as paginated via interface.
app/Http/Resources/V1/Client/ClientCollection.php Marks collection as paginated via interface.
app/Http/Requests/V1/TimeEntry/TimeEntryUpdateRequest.php Tightens project validation visibility based on permissions.
app/Http/Requests/V1/TimeEntry/TimeEntryUpdateMultipleRequest.php Adds project visibility check + validates changes.invoiced_at.
app/Http/Requests/V1/TimeEntry/TimeEntryStoreRequest.php Tightens project validation visibility based on permissions.
app/Http/Requests/V1/TimeEntry/TimeEntryIndexRequest.php Adds sentinel none validation + invoiced filter parameter validation.
app/Http/Requests/V1/TimeEntry/TimeEntryIndexExportRequest.php Aligns export index validation with sentinel none + adds invoiced filter.
app/Http/Requests/V1/TimeEntry/TimeEntryAggregateRequest.php Adds sentinel none handling in validation closures.
app/Http/Requests/V1/TimeEntry/TimeEntryAggregateExportRequest.php Adds sentinel none handling in validation closures.
app/Http/Requests/V1/Task/TaskIndexRequest.php Adds page validation.
app/Http/Requests/V1/Tag/TagIndexRequest.php Adds page validation for tags index.
app/Http/Requests/V1/Report/ReportStoreRequest.php Allows sentinel none values in report filter property ID arrays.
app/Http/Requests/V1/Report/ReportIndexRequest.php Adds page validation for reports index.
app/Http/Requests/V1/ProjectMember/ProjectMemberIndexRequest.php Adds page validation for project members index.
app/Http/Requests/V1/Member/MemberMergeIntoRequest.php Adjusts return type doc to use Rule import.
app/Http/Requests/V1/Member/MemberIndexRequest.php Adds page validation.
app/Http/Requests/V1/Invitation/InvitationIndexRequest.php Adds page validation.
app/Http/Middleware/ShareInertiaData.php Adds sidebar counts for projects/clients respecting visibility permissions.
app/Http/Middleware/RedirectIfAuthenticated.php Updates docblock type signature to imported types.
app/Http/Middleware/ForceJsonResponse.php Updates docblock type signature to imported types.
app/Http/Middleware/ForceHttps.php Updates docblock type signature to imported types.
app/Http/Kernel.php Refactors middleware registration to use imported class names.
app/Http/Controllers/Api/V1/TimeEntryController.php Blocks modifying invoiced time entries; wires invoiced filter; improves type imports.
app/Http/Controllers/Api/V1/TaskController.php Adds default ordering for tasks index.
app/Http/Controllers/Api/V1/TagController.php Adds index request validation parameter.
app/Http/Controllers/Api/V1/ReportController.php Adds index request validation parameter; allows updating public_until for public reports.
app/Http/Controllers/Api/V1/ProjectMemberController.php Adds index request validation + default ordering.
app/Http/Controllers/Api/V1/ProjectController.php Adds ordering; disables deletion endpoint behavior.
app/Http/Controllers/Api/V1/MemberController.php Adds default ordering for member index.
app/Http/Controllers/Api/V1/InvitationController.php Adds default ordering for invitations index.
app/Http/Controllers/Api/V1/ClientController.php Orders clients by name; disables deletion endpoint behavior.
app/Http/Controllers/Api/V1/ChartController.php Increases daily tracked hours window.
app/Http/Controllers/Api/V1/ApiTokenController.php Adds default ordering for API tokens index.
app/Filament/Resources/UserResource.php Replaces fully qualified TextInput usage with imported alias.
app/Filament/Resources/TimeEntryResource/Pages/EditTimeEntry.php Ensures user/org fields are derived from member on save.
app/Filament/Resources/TimeEntryResource/Pages/CreateTimeEntry.php Ensures user/org fields are derived from member on create.
app/Filament/Resources/TimeEntryResource.php Switches to selecting member; adds task selection; column aliases cleanup.
app/Filament/Resources/ReportResource.php Cleans up component references to use imported aliases.
app/Filament/Resources/OrganizationResource/RelationManagers/UsersRelationManager.php Cleans up column/action references to use imported aliases.
app/Filament/Resources/OrganizationResource.php Cleans up select/column references to use imported aliases.
app/Filament/Resources/OrganizationInvitationResource.php Cleans up select reference to use imported alias.
app/Filament/Resources/FailedJobResource.php Fixes Textarea component naming.
app/Exceptions/Api/TimeEntryInvoicedApiException.php Adds new API exception key for invoiced time entry modifications.
app/Actions/Jetstream/UpdateOrganization.php Adjusts Gate authorize call signature usage.
app/Actions/Jetstream/AddOrganizationMember.php Adjusts Gate authorize call signature usage.
SECURITY.md Removes repository security policy document.
README.md Adds contribution warning language.
CONTRIBUTING.md Removes contributing guide content.
CODE_OF_CONDUCT.md Removes code of conduct.
.nvmrc Pins Node major version for local dev.
.github/workflows/playwright.yml Disables Playwright workflow and adds sharding/Octane/Mailpit steps for future use.
.github/workflows/pint.yml Updates Laravel Pint action version.
.github/workflows/phpunit.yml Updates CI to PHP 8.4 and Node 22; speeds up npm install.
.github/workflows/phpstan.yml Updates CI to PHP 8.4.
.github/workflows/npm-typecheck.yml Updates CI to PHP 8.4 and Node 22.
.github/workflows/npm-publish-ui.yml Removes UI npm publish workflow.
.github/workflows/npm-publish-api.yml Removes API npm publish workflow.
.github/workflows/npm-lint.yml Updates Node action + speeds up npm install.
.github/workflows/npm-format-check.yml Updates Node action + speeds up npm install.
.github/workflows/npm-build.yml Updates CI to PHP 8.4 and Node 22; speeds up npm install.
.github/workflows/generate-api-docs.yml Removes API docs generation/deploy workflow.
.github/workflows/build-private.yml Removes private build workflow.
.github/workflows/README.md Adds a short README for workflows directory.
.github/PULL_REQUEST_TEMPLATE.md Removes PR template.
.github/ISSUE_TEMPLATE/config.yml Removes issue template configuration.
.github/ISSUE_TEMPLATE/1_bug_report.yml Removes bug report issue template.
.env.ci Switches CI mailer to SMTP (Mailpit) and configures Octane server value.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

</ClientMultiselectDropdown>
<TagDropdown
v-model="selectedTags"
:create-tag
memberBody.value.billable_rate = null;
} else if (billableRateSelect.value === 'custom-rate') {
memberBody.value.billable_rate = props.member.billable_rate ?? 0;
if (!memberBody.value.billable_rate) {
const { members } = useMembersQuery();

const currentMember = computed(() => {
return members.value.find((member) => member.id === props.projectMember.user_id);
Comment on lines +72 to +75
'host' => env('DB_READ_HOST', env('DB_HOST')),
],
'write' => [
'host' => env('DB_WRITE_HOST', env('DB_HOST')),
request: APIRequestContext,
query: string
): Promise<{ messages: Array<{ ID: string; Subject: string }> }> {
const response = await request.get(`${MAILPIT_BASE_URL}/api/v1/search?query=${query}`);
Comment on lines +11 to +12
for (let i = 0; i < count; i++) {
const text = await rows.nth(i).locator('div').first().textContent();
Comment on lines +1 to +10
name: Playwright Tests (disabled)
on:
push:
branches-ignore:
- '**'
permissions:
contents: read
jobs:
test:
if: false # Temporarily disabled
Comment on lines +1 to +10
name: Playwright Tests (disabled)
on:
push:
branches-ignore:
- '**'
permissions:
contents: read
jobs:
test:
if: false # Temporarily disabled

return response()->json(null, 204);
// Deletion disabled: return early to keep data intact
return response()->json(['message' => 'Client deletion disabled'], 200);
return response()
->json(null, 204);
// Deletion disabled: return early to keep data intact
return response()->json(['message' => 'Project deletion disabled'], 200);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants